# Copyright 2020 Evan Miller
# Copyright 2020 Matt Borland
# Copyright 2021 John Maddock
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)

name: CI
on: [ push, pull_request ]
jobs:
  ubuntu-focal:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        compiler: [ g++-9, g++-10, clang++-9, clang++-10 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Set TOOLSET
        run: echo ${{ matrix.compiler }} | awk '/^g/ { print "TOOLSET=gcc" } /^clang/ { print "TOOLSET=clang" }' >> $GITHUB_ENV
      - name: Add repository
        run: sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
      - name: Install packages
        run: sudo apt install g++-9 g++-10 clang-9 clang-10
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: cp -r $GITHUB_WORKSPACE/* libs/config
        working-directory: ../boost-root
      - name: Bootstrap
        run: ./bootstrap.sh
        working-directory: ../boost-root
      - name: Generate headers
        run: ./b2 headers
        working-directory: ../boost-root
      - name: Generate user config
        run: 'echo "using $TOOLSET : : ${{ matrix.compiler }} ;" > ~/user-config.jam'
        working-directory: ../boost-root
      - name: Config info
        run: ../../../b2 print_config_info toolset=$TOOLSET cxxstd=03,11,14,17,2a
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ../../../b2 toolset=$TOOLSET cxxstd=03,11,14,17,2a
        working-directory: ../boost-root/libs/config/test
  ubuntu-bionic:
    runs-on: ubuntu-18.04
    strategy:
      fail-fast: false
      matrix:
        compiler: [ g++-7, g++-8, clang++-7, clang++-8 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Set TOOLSET
        run: echo ${{ matrix.compiler }} | awk '/^g/ { print "TOOLSET=gcc" } /^clang/ { print "TOOLSET=clang" }' >> $GITHUB_ENV
      - name: Add repository
        run: sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
      - name: Install packages
        run: sudo apt install g++-7 g++-8 clang-7 clang-8
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: cp -r $GITHUB_WORKSPACE/* libs/config
        working-directory: ../boost-root
      - name: Bootstrap
        run: ./bootstrap.sh
        working-directory: ../boost-root
      - name: Generate headers
        run: ./b2 headers
        working-directory: ../boost-root
      - name: Generate user config
        run: 'echo "using $TOOLSET : : ${{ matrix.compiler }} ;" > ~/user-config.jam'
        working-directory: ../boost-root
      - name: Config info install
        run: ../../../b2 print_config_info toolset=$TOOLSET cxxstd=03,11,14,17
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ../../../b2 toolset=$TOOLSET cxxstd=03,11,14,17
        working-directory: ../boost-root/libs/config/test
  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        toolset: [ clang ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[linux];[Linux];[LINUX]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: cp -r $GITHUB_WORKSPACE/* libs/config
        working-directory: ../boost-root
      - name: Bootstrap
        run: ./bootstrap.sh
        working-directory: ../boost-root
      - name: Generate headers
        run: ./b2 headers
        working-directory: ../boost-root
      - name: Config info
        run: ../../../b2 print_config_info toolset=${{ matrix.toolset }} cxxstd=03,11,14,17,2a
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ../../../b2 toolset=${{ matrix.toolset }} cxxstd=03,11,14,17,2a
        working-directory: ../boost-root/libs/config/test
  windows_msvc_14_0:
    runs-on: windows-latest
    defaults:
      run:
        shell: cmd
    strategy:
      fail-fast: false
      matrix:
        toolset: [ msvc-14.0 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
        working-directory: ../boost-root
      - name: Bootstrap
        run: bootstrap
        working-directory: ../boost-root
      - name: Generate headers
        run: b2 headers
        working-directory: ../boost-root
      - name: Config info
        run: ..\..\..\b2 print_config_info cxxstd=14,17 address-model=64 toolset=msvc-14.0
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17 toolset=msvc-14.0
        working-directory: ../boost-root/libs/config/test
  windows_msvc_14_2:
    runs-on: windows-2019
    defaults:
      run:
        shell: cmd
    strategy:
      fail-fast: false
      matrix:
        toolset: [ msvc-14.2 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
        working-directory: ../boost-root
      - name: Bootstrap
        run: bootstrap
        working-directory: ../boost-root
      - name: Generate headers
        run: b2 headers
        working-directory: ../boost-root
      - name: Config info
        run: ..\..\..\b2 print_config_info cxxstd=14,17,latest address-model=64 toolset=msvc-14.2
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17,latest toolset=msvc-14.2
        working-directory: ../boost-root/libs/config/test
  windows_msvc_14_3:
    runs-on: windows-2022
    defaults:
      run:
        shell: cmd
    strategy:
      fail-fast: false
      matrix:
        toolset: [ msvc-14.3 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
        working-directory: ../boost-root
      - name: Bootstrap
        run: bootstrap
        working-directory: ../boost-root
      - name: Generate headers
        run: b2 headers
        working-directory: ../boost-root
      - name: Config info
        run: ..\..\..\b2 print_config_info cxxstd=14,17,latest address-model=64 toolset=msvc-14.3
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17,latest toolset=msvc-14.3
        working-directory: ../boost-root/libs/config/test
  windows_clang_msvc_14_3:
    runs-on: windows-2022
    defaults:
      run:
        shell: cmd
    strategy:
      fail-fast: false
      matrix:
        toolset: [ clang-msvc-14.3 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
        working-directory: ../boost-root
      - name: Bootstrap
        run: bootstrap
        working-directory: ../boost-root
      - name: Generate headers
        run: b2 headers
        working-directory: ../boost-root
      - name: Config info
        run: ..\..\..\b2 print_config_info cxxstd=14,17,latest address-model=64 toolset=clang-win embed-manifest-via=linker
        working-directory: ../boost-root/libs/config/test
      - name: Test
        run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17,latest toolset=clang-win embed-manifest-via=linker
        working-directory: ../boost-root/libs/config/test
  non_intel_ubuntu_20_04_gcc:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        qemu_arch: [ aarch64, s390x, ppc64le ]
    steps:
      - uses: actions/checkout@v2.1.0
      - uses: uraimo/run-on-arch-action@v2.0.5
        name: Run commands
        id: runcmd
        with:
          arch: ${{ matrix.qemu_arch }}
          distro: ubuntu20.04

          # Not required, but speeds up builds by storing container images in
          # a GitHub package registry.
          #githubToken: ${{ github.token }}

          # Set an output parameter `uname` for use in subsequent steps
          run: |
            uname -a
            apt update
            apt -y install gcc g++ git python
            echo $PWD
            config=$PWD
            cd ..
            git clone -b develop --depth 1 https://github.com/boostorg/boost.git boost-root
            cd boost-root
            rm -rf libs/config/*
            cp -r $config/* libs/config
            git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
            ./bootstrap.sh
            ./b2 headers
            ./b2 toolset=gcc libs/config/test//print_config_info libs/config/test//print_math_info
            cd libs/config/test && ../../../b2 toolset=gcc cxxstd=03,11,14,17
  non_intel_ubuntu_20_04_clang:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        qemu_arch: [ aarch64, ppc64le ]
    steps:
      - uses: actions/checkout@v2.1.0
      - uses: uraimo/run-on-arch-action@v2.0.5
        name: Run commands
        id: runcmd
        with:
          arch: ${{ matrix.qemu_arch }}
          distro: ubuntu20.04

          # Not required, but speeds up builds by storing container images in
          # a GitHub package registry.
          #githubToken: ${{ github.token }}

          # Set an output parameter `uname` for use in subsequent steps
          run: |
            uname -a
            apt update
            apt -y install clang gcc g++ git python
            echo $PWD
            config=$PWD
            cd ..
            git clone -b develop --depth 1 https://github.com/boostorg/boost.git boost-root
            cd boost-root
            rm -rf libs/config/*
            cp -r $config/* libs/config
            git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
            ./bootstrap.sh
            ./b2 headers
            ./b2 toolset=clang libs/config/test//print_config_info libs/config/test//print_math_info
            cd libs/config/test
            ../../../b2 toolset=clang cxxstd=03,11,14,17
  emscripten_wasm:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        compiler: [ emcc ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
          commit-filter-separator: ';'
          fail-fast: true
      - name: Install Emscripten
        run: |
         uname -a
         echo $PWD
         config=$PWD
         cd ..
         git clone https://github.com/emscripten-core/emsdk.git
         cd emsdk
         git pull
         ./emsdk install latest
         ./emsdk activate latest
         source ./emsdk_env.sh
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: cp -r $GITHUB_WORKSPACE/* libs/config
        working-directory: ../boost-root
      - name: Bootstrap
        run: ./bootstrap.sh
        working-directory: ../boost-root
      - name: Generate headers
        run: ./b2 headers
        working-directory: ../boost-root
      - name: Test config_info (default)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -I. -O3 -o config_info libs/config/test/config_info.cpp
         node config_info
      - name: Test config_test (default)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -s EXIT_RUNTIME=1 -s DISABLE_EXCEPTION_CATCHING=0 -I. -O3 -o config_test libs/config/test/config_test.cpp
         node config_test
      - name: Test config_info (-fno-exceptions)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -I. -O3 -fno-exceptions -o config_info libs/config/test/config_info.cpp
         node config_info
      - name: Test config_test (-fno-exceptions)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -s EXIT_RUNTIME=1 -fno-exceptions -I. -O3 -o config_test libs/config/test/config_test.cpp
         node config_test
      - name: Test config_info (pthread)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -pthread -s EXIT_RUNTIME=1 -s PTHREAD_POOL_SIZE=32 -I. -O3 -o config_info_pthread libs/config/test/config_info.cpp
         node --experimental-wasm-threads --experimental-wasm-bulk-memory config_info_pthread
      - name: Test config_test (pthread)
        working-directory: ../boost-root
        run: |
         source ../emsdk/emsdk_env.sh
         emcc -pthread -s EXIT_RUNTIME=1 -s PTHREAD_POOL_SIZE=32 -s DISABLE_EXCEPTION_CATCHING=0 -I. -O3 -o config_test_pthread libs/config/test/config_test.cpp
         node --experimental-wasm-threads --experimental-wasm-bulk-memory config_test_pthread
  ubuntu-cuda:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        std: [ 11, 14, 17 ]
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: mstachniuk/ci-skip@v1
        with:
          commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
          commit-filter-separator: ';'
          fail-fast: true
      - uses: Jimver/cuda-toolkit@v0.2.4
      - name: Add repository
        run: sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
      - name: Install packages
        run: sudo apt install g++-11 clang-11
      - name: Checkout main boost
        run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
      - name: Update Dependencies
        run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits
        working-directory: ../boost-root
      - name: Copy files
        run: cp -r $GITHUB_WORKSPACE/* libs/config
        working-directory: ../boost-root
      - name: Bootstrap
        run: ./bootstrap.sh
        working-directory: ../boost-root
      - name: Generate headers
        run: ./b2 headers
        working-directory: ../boost-root
      - name: nvcc version
        run: nvcc --version
        working-directory: ../boost-root/libs/config/test
      - name: Config info nvcc
        run: nvcc -std=c++${{ matrix.std }} -o config_info -I../../.. config_info.cpp && ./config_info
        working-directory: ../boost-root/libs/config/test
      - name: Config_test nvcc
        run: nvcc -std=c++${{ matrix.std }} -o config_test -I../../.. config_test.cpp && ./config_test
        working-directory: ../boost-root/libs/config/test
      - name: Config_test nvcc-cuda
        run: nvcc -c -std=c++${{ matrix.std }} -I../../.. config_test.cu
        working-directory: ../boost-root/libs/config/test
      - name: Config info nvcc+clang
        run: nvcc -std=c++${{ matrix.std }} --compiler-bindir=clang++ -o config_info -I../../.. config_info.cpp && ./config_info
        working-directory: ../boost-root/libs/config/test
      - name: Config_test nvcc+clang
        run: nvcc -std=c++${{ matrix.std }} --compiler-bindir=clang++ -o config_test -I../../.. config_test.cpp  -latomic && ./config_test
        working-directory: ../boost-root/libs/config/test
      - name: Config_test nvcc-cuda+clang
        run: nvcc -c -std=c++${{ matrix.std }} --compiler-bindir=clang++ -I../../.. config_test.cu
        working-directory: ../boost-root/libs/config/test
      - name: Config_test clang-cuda
        run: clang++ -nocudalib --no-cuda-version-check -c --cuda-gpu-arch=sm_75 -std=c++${{ matrix.std }} -I../../.. config_test.cu
        working-directory: ../boost-root/libs/config/test
